home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctj0187.arc / BOTTLE2.ASM < prev    next >
Assembly Source File  |  1987-01-28  |  8KB  |  304 lines

  1. ;
  2. ; Listing 2.
  3. ;
  4. ; Modified from listings in "Out From the Shadow of IBM," by
  5. ; Steven Armbrust, Ted Forgeron, and Paul Pierce,
  6. ; PC Tech Journal, August, 1986.
  7. ;
  8. ; Assembled with Microsoft Assembler version 4.0.
  9. ;
  10.     NAME    TIME
  11. _TEXT    SEGMENT    BYTE PUBLIC 'CODE'
  12. _TEXT    ENDS
  13. CONST    SEGMENT    WORD PUBLIC 'CONST'
  14. CONST    ENDS
  15. _BSS    SEGMENT    WORD PUBLIC 'BSS'
  16. _BSS    ENDS
  17. _DATA    SEGMENT    WORD PUBLIC 'DATA'
  18. _DATA    ENDS
  19. DGROUP    GROUP    CONST, _BSS, _DATA
  20.     ASSUME    CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  21.  
  22. TESTSEG    SEGMENT    WORD PUBLIC 'TEST'
  23.  
  24. TESTSEG_START    DW    32767 DUP (?)
  25.  
  26. TESTSEG    ENDS
  27.  
  28.  
  29. PPI_PORT    EQU    061H
  30. TIMER2_PORT    EQU    042H
  31. TIMER_CTRL    EQU    043H
  32.  
  33. _TEXT    SEGMENT
  34.  
  35. ;***************************************************************;
  36. ;                                ;
  37. ;    _BSTOTIME                        ;
  38. ;    TIME EXECUTION OF REP STOSB INSTRUCTION            ;
  39. ;                                ;
  40. ;***************************************************************;
  41.     PUBLIC    _BSTOTIME
  42. _BSTOTIME    PROC    NEAR
  43.     PUSH    BP            ; SAVE FRAME
  44.     MOV    BP, SP            ;
  45.     PUSH    ES            ; SAVE ES
  46.     PUSH    DI            ; SAVE DI
  47.     CALL    SETUP_TIMER        ; SET UP TIMER
  48.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  49.     MOV    DI,0
  50.     MOV    ES, [BP+6]        ; ES:DI -> TEST BUFFER
  51.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  52.     MOV    BL,AL            ; SAVE IN BL
  53.     OR    AX, 1            ; SET TIMER ENABLE BIT
  54.     CLI                ; STOP INTERRUPTS
  55.     CLD                ; SET FORWARD DIRECTION
  56.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  57.     REP STOSB            ; RUN TEST
  58.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  59.     OUT    PPI_PORT, AL        ;
  60.     STI                ; START INTERRUPTS
  61.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  62.     POP    DI            ; RESTORE DI
  63.     POP    ES            ; RESTORE ES
  64.     POP    BP            ; RESTORE BP
  65.     RET                ; RETURN
  66. _BSTOTIME    ENDP
  67. ;***************************************************************;
  68. ;                                ;
  69. ;    _WSTOTIME                        ;
  70. ;    TIME EXECUTION OF REP STOSW INSTRUCTION            ;
  71. ;                                ;
  72. ;***************************************************************;
  73.     PUBLIC    _WSTOTIME
  74. _WSTOTIME    PROC    NEAR
  75.     PUSH    BP            ; SAVE FRAME
  76.     MOV    BP, SP            ;
  77.     PUSH    ES            ; SAVE ES
  78.     PUSH    DI            ; SAVE DI
  79.     CALL    SETUP_TIMER        ; SET UP TIMER
  80.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  81.     MOV    DI,0
  82.     MOV    ES, [BP+6]        ; ES:DI -> TEST BUFFER
  83.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  84.     MOV    BL,AL            ; SAVE IN BL
  85.     OR    AX, 1            ; SET TIMER ENABLE BIT
  86.     CLI                ; STOP INTERRUPTS
  87.     CLD                ; SET FORWARD DIRECTION
  88.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  89.     REP STOSW            ; RUN TEST
  90.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  91.     OUT    PPI_PORT, AL        ;
  92.     STI                ; START INTERRUPTS
  93.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  94.     POP    DI            ; RESTORE DI
  95.     POP    ES            ; RESTORE ES
  96.     POP    BP            ; RESTORE BP
  97.     RET                ; RETURN
  98. _WSTOTIME    ENDP
  99. ;***************************************************************;
  100. ;                                ;
  101. ;    _BMVSTIME                        ;
  102. ;    TIME EXECUTION OF REP MOVSB INSTRUCTION            ;
  103. ;                                ;
  104. ;***************************************************************;
  105.     PUBLIC    _BMVSTIME
  106. _BMVSTIME    PROC    NEAR
  107.     PUSH    BP            ; SAVE FRAME
  108.     MOV    BP, SP            ;
  109.     PUSH    DS            ; PUSH DS
  110.     PUSH    ES            ; SAVE ES
  111.     PUSH    SI            ; SAVE SI
  112.     PUSH    DI            ; SAVE DI
  113.     CALL    SETUP_TIMER        ; SET UP TIMER
  114.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  115.     MOV    DI, 0
  116.     MOV    SI, DI
  117.     MOV    DS, [BP+6]        ; DS:SI -> SOURCE BUFFER
  118.     MOV    ES, [BP+8]        ; ES:DI -> DEST. BUFFER
  119.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  120.     MOV    BL,AL            ; SAVE IN BL
  121.     OR    AX, 1            ; SET TIMER ENABLE BIT
  122.     CLI                ; STOP INTERRUPTS
  123.     CLD                ; SET FORWARD DIRECTION
  124.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  125.     REP MOVSB            ; RUN TEST
  126.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  127.     OUT    PPI_PORT, AL        ;
  128.     STI                ; START INTERRUPTS
  129.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  130.     POP    DI            ; RESTORE DI
  131.     POP    SI            ; RESTORE SI
  132.     POP    ES            ; RESTORE ES
  133.     POP    DS            ; RESTORE DS
  134.     POP    BP            ; RESTORE BP
  135.     RET                ; RETURN
  136. _BMVSTIME    ENDP
  137. ;***************************************************************;
  138. ;                                ;
  139. ;    _WMVSTIME                        ;
  140. ;    TIME EXECUTION OF REP MOVSW INSTRUCTION            ;
  141. ;    FROM SYSTEM MEMORY TO SYSTEM MEMORY            ;
  142. ;                                ;
  143. ;***************************************************************;
  144.     PUBLIC    _WMVSTIME
  145. _WMVSTIME    PROC    NEAR
  146.     PUSH    BP            ; SAVE FRAME
  147.     MOV    BP, SP            ;
  148.     PUSH    DS            ; PUSH DS
  149.     PUSH    ES            ; SAVE ES
  150.     PUSH    SI            ; SAVE SI
  151.     PUSH    DI            ; SAVE DI
  152.     CALL    SETUP_TIMER        ; SET UP TIMER
  153.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  154.     MOV    DI, 0
  155.     MOV    SI, DI
  156.     MOV    DS, [BP+6]        ; DS:SI -> SOURCE BUFFER
  157.     MOV    ES, [BP+8]        ; ES:DI -> DEST. BUFFER
  158.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  159.     MOV    BL,AL            ; SAVE IN BL
  160.     OR    AX, 1            ; SET TIMER ENABLE BIT
  161.     CLI                ; STOP INTERRUPTS
  162.     CLD                ; SET FORWARD DIRECTION
  163.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  164.     REP MOVSW            ; RUN TEST
  165.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  166.     OUT    PPI_PORT, AL        ;
  167.     STI                ; START INTERRUPTS
  168.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  169.     POP    DI            ; RESTORE DI
  170.     POP    SI            ; RESTORE SI
  171.     POP    ES            ; RESTORE ES
  172.     POP    DS            ; RESTORE DS
  173.     POP    BP            ; RESTORE BP
  174.     RET                ; RETURN
  175. _WMVSTIME    ENDP
  176. ;***************************************************************;
  177. ;                                ;
  178. ;    _BMVTIME                        ;
  179. ;    TIME EXECUTION OF MOV/LOOP BYTE                ;
  180. ;                                ;
  181. ;***************************************************************;
  182.     PUBLIC    _BMVTIME
  183. _BMVTIME    PROC    NEAR
  184.     PUSH    BP            ; SAVE FRAME
  185.     MOV    BP, SP            ;
  186.     PUSH    DS            ; PUSH DS
  187.     PUSH    ES            ; SAVE ES
  188.     PUSH    SI            ; SAVE SI
  189.     PUSH    DI            ; SAVE DI
  190.     CALL    SETUP_TIMER        ; SET UP TIMER
  191.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  192.     MOV    DI, 0
  193.     MOV    SI, DI
  194.     MOV    DS, [BP+6]        ; DS:SI -> SOURCE BUFFER
  195.     MOV    ES, [BP+8]        ; ES:DI -> DEST. BUFFER
  196.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  197.     MOV    BL,AL            ; SAVE IN BL
  198.     OR    AX, 1            ; SET TIMER ENABLE BIT
  199.     CLI                ; STOP INTERRUPTS
  200.     CLD                ; SET FORWARD DIRECTION
  201.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  202. BMVLP:
  203.     MOV    AL,[SI]            ; RUN TEST
  204.     MOV    ES:[DI],AL
  205.     INC    SI
  206.     INC    DI
  207.     LOOP    BMVLP
  208.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  209.     OUT    PPI_PORT, AL        ;
  210.     STI                ; START INTERRUPTS
  211.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  212.     POP    DI            ; RESTORE DI
  213.     POP    SI            ; RESTORE SI
  214.     POP    ES            ; RESTORE ES
  215.     POP    DS            ; RESTORE DS
  216.     POP    BP            ; RESTORE BP
  217.     RET                ; RETURN
  218. _BMVTIME    ENDP
  219. ;***************************************************************;
  220. ;                                ;
  221. ;    _WMVTIME                        ;
  222. ;    TIME EXECUTION OF MOV/LOOP WORD                ;
  223. ;                                ;
  224. ;***************************************************************;
  225.     PUBLIC    _WMVTIME
  226. _WMVTIME    PROC    NEAR
  227.     PUSH    BP            ; SAVE FRAME
  228.     MOV    BP, SP            ;
  229.     PUSH    DS            ; PUSH DS
  230.     PUSH    ES            ; SAVE ES
  231.     PUSH    SI            ; SAVE SI
  232.     PUSH    DI            ; SAVE DI
  233.     CALL    SETUP_TIMER        ; SET UP TIMER
  234.     MOV    CX, [BP+4]        ; GET COUNT ARGUMENT
  235.     MOV    DI, 0
  236.     MOV    SI, DI
  237.     MOV    DS, [BP+6]        ; DS:SI -> SOURCE BUFFER
  238.     MOV    ES, [BP+8]        ; ES:DI -> DEST. BUFFER
  239.     IN    AL, PPI_PORT        ; GET CURRENT CONTROL
  240.     MOV    BL,AL            ; SAVE IN BL
  241.     OR    AX, 1            ; SET TIMER ENABLE BIT
  242.     CLI                ; STOP INTERRUPTS
  243.     CLD                ; SET FORWARD DIRECTION
  244.     OUT    PPI_PORT, AL        ; ENABLE TIMER
  245. WMVLP:
  246.     MOV    AX,[SI]            ; RUN TEST
  247.     MOV    ES:[DI],AX
  248.     INC    SI
  249.     INC    SI
  250.     INC    DI
  251.     INC    DI
  252.     LOOP    WMVLP
  253.     MOV    AL, BL            ; RESTORE CONTROL VALUE
  254.     OUT    PPI_PORT, AL        ;
  255.     STI                ; START INTERRUPTS
  256.     CALL    GET_TIMER        ; OBTAIN FINAL COUNT
  257.     POP    DI            ; RESTORE DI
  258.     POP    SI            ; RESTORE SI
  259.     POP    ES            ; RESTORE ES
  260.     POP    DS            ; RESTORE DS
  261.     POP    BP            ; RESTORE BP
  262.     RET                ; RETURN
  263. _WMVTIME    ENDP
  264. ;***************************************************************;
  265. ;                                ;
  266. ;    SETUP_TIMER                        ;
  267. ;    SET UP THE TIMER FOR MAXIMUM COUNT, TO TIME A RUN    ;
  268. ;                                ;
  269. ;***************************************************************;
  270. SETUP_TIMER    PROC    NEAR
  271.     PUSH    AX            ; SAVE AX
  272.     IN    AL, PPI_PORT        ; STOP THE TIMER
  273.     AND    AL, 0FCH        ;
  274.     OUT    PPI_PORT, AL        ;
  275.     MOV    AL, 0B4H        ; INITIALIZE THE TIMER
  276.     OUT    TIMER_CTRL, AL        ;
  277.     MOV    AL, 0            ; CLEAR THE COUNT
  278.     OUT    TIMER2_PORT, AL        ;
  279.     NOP                ;
  280.     OUT    TIMER2_PORT, AL        ;
  281.     POP    AX            ; RESTORE AX
  282.     RET                ; RETURN
  283. SETUP_TIMER    ENDP
  284. ;***************************************************************;
  285. ;                                ;
  286. ;    GET_TIMER                        ;
  287. ;    TAKE THE COUNT FROM THE TIMER                ;
  288. ;                                ;
  289. ;***************************************************************;
  290. GET_TIMER    PROC    NEAR
  291.     PUSH    BX            ; SAVE REGISTERS
  292.     IN    AL, TIMER2_PORT        ; GET LOW BYTE OF TIME
  293.     MOV    AH, AL            ;
  294.     IN    AL, TIMER2_PORT        ; GET HIGH BYTE
  295.     XCHG    AL,AH            ; TIME IN AX
  296.     NEG    AX            ; CORRECT FOR COUNT-DOWN
  297.     POP    BX            ; RESTORE REGISTERS
  298.     RET                ; RETURN
  299. GET_TIMER    ENDP
  300.  
  301. _TEXT    ENDS
  302.     END
  303.  
  304.